package pl.edu.fuw.fid.signalanalysis.waveform;
import java.util.Arrays;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.chart.XYChart;
import org.apache.commons.math.complex.Complex;
import org.signalml.math.fft.WindowFunction;
import org.signalml.math.fft.WindowType;
/**
* Computes values of waveforms around some given time location.
*
* @author ptr@mimuw.edu.pl
*/
public class WaveformRenderer {
public static ObservableList<XYChart.Data<Number,Number>> compute(Waveform wf, double t0, WindowType windowType, Complex coeff, double samplingFrequency) {
double hw = wf.getHalfWidth();
double tStart = t0 - hw, tEnd = t0 + hw;
int iStart = (int) Math.round(tStart * samplingFrequency - 0.5);
int iEnd = (int) Math.round(tEnd * samplingFrequency + 0.5);
int length = (int) (1 + iEnd - iStart);
double[] ones = new double[length];
Arrays.fill(ones, 1.0);
if (windowType != null) {
ones = new WindowFunction(windowType, windowType.getParameterDefault()).applyWindow(ones);
}
Complex[] values = new Complex[length];
double sumSquare = 0.0;
for (int i=iStart; i<=iEnd; ++i) {
double t = i / samplingFrequency;
Complex waveformValue = wf.value(t-t0).multiply(ones[i-iStart]);
values[i-iStart] = waveformValue;
double re = waveformValue.getReal();
double im = waveformValue.getImaginary();
sumSquare += re*re + im*im;
}
final Complex norm = coeff.multiply(1.0/Math.sqrt(sumSquare * samplingFrequency));
ObservableList<XYChart.Data<Number,Number>> result = FXCollections.observableArrayList();
for (int i=iStart; i<=iEnd; ++i) {
double t = i / samplingFrequency;
double value = values[i-iStart].multiply(norm).getReal();
result.add(new XYChart.Data<Number,Number>(t, value));
}
return result;
}
}